

let obj = {
  name:'zb',
  age:{
    age:18
  },
};

function observer(obj) {
  if (typeof obj === 'object'){
    for (let key in obj){
      defineReactive(obj,key,obj[key]);
    }
  }
}
function defineReactive(obj,key,value) {

  observer(value);
  Object.defineProperty(obj,key,{
    get() {
      return value;
    },
    set(val) {
      observer(val);
      console.log('数据更新了')
      value = val;
    }
  })
}
observer(obj);
let oldPush = Array.prototype.push;
Array.prototype.push = function(value){
  console.log('数据更新了')
  oldPush.call(this,value);
}
obj.age={
  name:1
}
console.log(obj.age.name)
// 如果属性不存在 默认后增加的内容并不会刷新视图
// 数组调用push 是无效的 Object.defineProperty 不支持数组

let arr = ['push','slice','shift','unshift'];
arr.forEach(method=>{
  let oldMethod = Array.prototype[method];
  Array.prototype[method] = function(value){
    console.log('数据更新了')
    oldMethod.call(this,value);
  }
});
//数组不能通过长度修改、通过索引修改。

